package cn.liulingfengyu.behavioralpatterns.statepattern;

/**
 * 状态模式示例
 */
public class StatePatternDemo {
    public static void main(String[] args) {
        // 创建上下文对象
        Context context = new Context();

        // 初始状态
        System.out.println("初始状态：");
        context.request();

        // 更改状态为具体状态A
        context.setState(new ConcreteStateA());
        System.out.println("\n更改状态为具体状态A：");
        context.request();

        // 更改状态为具体状态B
        context.setState(new ConcreteStateB());
        System.out.println("\n更改状态为具体状态B：");
        context.request();
    }
}

/**
 * 上下文类
 */
class Context {
    private State state;

    public Context() {
        // 默认状态
        this.state = new ConcreteStateA();
    }

    public void setState(State state) {
        this.state = state;
    }

    public void request() {
        state.handle(this);
    }
}

/**
 * 状态接口
 */
interface State {
    void handle(Context context);
}

/**
 * 具体状态A
 */
class ConcreteStateA implements State {
    @Override
    public void handle(Context context) {
        System.out.println("具体状态A的行为");
        // 可以在这里改变上下文的状态
        // context.setState(new ConcreteStateB());
    }
}

/**
 * 具体状态B
 */
class ConcreteStateB implements State {
    @Override
    public void handle(Context context) {
        System.out.println("具体状态B的行为");
        // 可以在这里改变上下文的状态
        // context.setState(new ConcreteStateA());
    }
}